</> 技術筆記Tech Notes

DXCore API: 矩陣

一、概述

矩陣 類別提供了一個在 JavaScript 中建立和操作矩陣的完整框架。它繼承自原生的 Array,並擴充了大量用於線性代數運算的屬性和方法。

您可以透過兩種主要方式來初始化一個 矩陣 物件:

  1. 指定維度與預設值:提供橫列數、直行數和一個可選的初始值來建立矩陣。

  2. 從陣列初始化:提供一個二維陣列(陣列的陣列)來直接建立矩陣。

範例:建立矩陣

import 矩陣 from 'dx-core';

// 方法1: 建立一個 3x4 的矩陣,所有元素皆為 0
const m1 = new 矩陣(3, 4);
console.log(m1.轉為字串());
/*
[
  [ 0  0  0  0 ]
  [ 0  0  0  0 ]
  [ 0  0  0  0 ]
]
*/

// 方法2: 建立一個 2x2 的矩陣,並以 5 填滿
const m2 = new 矩陣(2, 2, 5);
console.log(m2.轉為字串());
/*
[
  [ 5  5 ]
  [ 5  5 ]
]
*/

// 方法3: 從現有陣列建立矩陣
const m3 = new 矩陣(
    [1, 2, 3],
    [4, 5, 6]
);
console.log(m3.轉為字串());
/*
[
  [ 1  2  3 ]
  [ 4  5  6 ]
]
*/

二、屬性

.列秩

回傳矩陣的列秩(Rank),即其橫列空間的維度。這是透過計算矩陣的上三角形式中非零橫列的數量來得到的。

  • 回傳Number

const m = new 矩陣([1, 2], [2, 4]);
console.log(m.列秩);
// 輸出: 1

.橫列數量

回傳矩陣的橫列(row)數量。

  • 回傳Number

const m = new 矩陣(5, 3);
console.log(m.橫列數量);
// 輸出: 5

.特徵值

回傳矩陣的行列式(Determinant)。

注意:雖然屬性名稱為 特徵值 (Eigenvalue),但其內部實作是計算行列式。它透過將矩陣化為上三角矩陣,然後將主對角線上的元素相乘來求得。

  • 回傳Number

const m = new 矩陣([4, 2], [1, 3]);
console.log(m.特徵值);
// 輸出: 10 (4 * 3 - 2 * 1)

.直行數量

回傳矩陣的直行(column)數量。

  • 回傳Number

const m = new 矩陣(5, 3);
console.log(m.直行數量);
// 輸出: 3

三、方法

Static 方法

單位矩陣(橫列數量)

建立並回傳一個指定大小的單位矩陣(Identity Matrix)。

  • 參數

    • 橫列數量 (Number):單位矩陣的維度(橫列數和直行數)。

  • 回傳矩陣

const I = 矩陣.單位矩陣(3);
console.log(I.轉為字串());
/*
[
  [ 1  0  0 ]
  [ 0  1  0 ]
  [ 0  0  1 ]
]
*/

Instance 方法

上三角矩陣()

將目前矩陣轉換為上三角矩陣(Upper Triangular Matrix)並回傳,原矩陣不變。

  • 回傳矩陣 - 一個新的上三角矩陣。

const m = new 矩陣([1, 2, 3], [1, 1, 1], [3, 3, 1]);
const upper = m.上三角矩陣();
console.log(upper.轉為字串());
/*
[
  [ 1  2  3 ]
  [ 0  -1  -2 ]
  [ 0  0  -2 ]
]
*/

乘(目標)

執行矩陣乘法。

  • 如果 目標 是數字,則執行純量乘法(Scalar Multiplication)。

  • 如果 目標 是另一個 矩陣 物件,則執行矩陣乘法。

  • 參數

    • 目標 (Number | 矩陣):要相乘的純量或矩陣。

  • 回傳矩陣 - 運算後的新矩陣。

const m = new 矩陣([1, 2], [3, 4]);

// 純量乘法
const m_scaled = m.乘(10);
console.log(m_scaled.轉為字串());
/*
[
  [ 10  20 ]
  [ 30  40 ]
]
*/

// 矩陣乘法
const m2 = new 矩陣([5, 6], [7, 8]);
const m_product = m.乘(m2);
console.log(m_product.轉為字串());
/*
[
  [ 19  22 ]
  [ 43  50 ]
]
*/

交換橫列(a, b)

交換矩陣中的兩個橫列。

  • 參數

    • a (Number):第一個橫列的索引。

    • b (Number):第二個橫列的索引。

  • 回傳矩陣 - 修改後的原矩陣。

const m = new 矩陣([1, 1], [2, 2], [3, 3]);
m.交換橫列(0, 2);
console.log(m.轉為字串());
/*
[
  [ 3  3 ]
  [ 2  2 ]
  [ 1  1 ]
]
*/

修正精確度誤差()

修正矩陣中因浮點數運算產生的微小誤差(例如 2.9999999999999996 會被修正為 3)。

  • 回傳矩陣 - 修改後的原矩陣。

冪次(n)

計算矩陣的 n 次方。

  • 參數

    • n (Number):次方數,必須為非負整數。

  • 回傳矩陣 - 運算後的新矩陣。

const m = new 矩陣([1, 2], [0, 1]);
const m_pow_3 = m.冪次(3);
console.log(m_pow_3.轉為字串());
/*
[
  [ 1  6 ]
  [ 0  1 ]
]
*/

加(目標)

執行矩陣加法。

  • 如果 目標 是數字,則將矩陣的每個元素加上該數值。

  • 如果 目標 是另一個 矩陣 物件,則執行對應元素的相加。

  • 參數

    • 目標 (Number | 矩陣):要相加的純量或矩陣。

  • 回傳矩陣 - 運算後的新矩陣。

const m = new 矩陣([1, 2], [3, 4]);

// 純量相加
const m_plus_10 = m.加(10);
console.log(m_plus_10.轉為字串());
/*
[
  [ 11  12 ]
  [ 13  14 ]
]
*/

// 矩陣相加
const m2 = new 矩陣([5, 6], [7, 8]);
const m_sum = m.加(m2);
console.log(m_sum.轉為字串());
/*
[
  [ 6  8 ]
  [ 10  12 ]
]
*/

反矩陣()

使用高斯-喬登消去法計算並回傳反矩陣(Inverse Matrix)。如果矩陣不可逆(非方陣、行列式為零),將會拋出錯誤。

  • 回傳矩陣 - 原矩陣的反矩陣。

const m = new 矩陣([4, 7], [2, 6]);
const inv_m = m.反矩陣();
console.log(inv_m.轉為字串());
/*
[
  [ 0.6  -0.7 ]
  [ -0.2  0.4 ]
]
*/

合併直行(m)

將另一個矩陣 m 合併到目前矩陣的右側。

  • 參數

    • m (矩陣):要合併的矩陣。

  • 回傳矩陣 - 一個新的、更寬的矩陣。

const m1 = new 矩陣([1], [2]);
const m2 = new 矩陣([3], [4]);
const combined = m1.合併直行(m2);
console.log(combined.轉為字串());
/*
[
  [ 1  3 ]
  [ 2  4 ]
]
*/

填滿(值)

用指定的值填滿整個矩陣。

  • 參數

    • (any):用來填滿矩陣的數值。

  • 回傳矩陣 - 修改後的原矩陣。

const m = new 矩陣(2, 3);
m.填滿(7);
console.log(m.轉為字串());
/*
[
  [ 7  7  7 ]
  [ 7  7  7 ]
]
*/

是反對稱矩陣()

檢查矩陣是否為反對稱矩陣 (Antisymmetric Matrix),即 AT=−A。

  • 回傳Boolean

是對稱矩陣()

檢查矩陣是否為對稱矩陣 (Symmetric Matrix),即 AT=A。

  • 回傳Boolean

是方塊矩陣()

檢查矩陣是否為方塊矩陣(Square Matrix),即橫列數等於直行數。

  • 回傳Boolean

橫列(橫列編號)

取得指定索引的橫列。

  • 參數

    • 橫列編號 (Number):橫列的索引。

  • 回傳向量 - 一個代表該橫列的 向量 物件。

const m = new 矩陣([1, 2, 3], [4, 5, 6]);
const row1 = m.橫列(1);
console.log(row1); // 假設向量物件有 toString 方法
// 輸出: [4, 5, 6]

每一個元素(回呼函式)

遍歷矩陣中的每一個元素。

  • 參數

    • 回呼函式 (Function):對每個元素執行的函式,接收 (元素, 橫列編號, 直行編號) 三個參數。

  • 回傳矩陣 - 原矩陣。

每一個橫列(回呼函式)

遍歷矩陣中的每一個橫列。

  • 參數

    • 回呼函式 (Function):對每個橫列執行的函式,接收 (橫列, 橫列編號) 兩個參數。

  • 回傳矩陣 - 原矩陣。

每一個直行(回呼函式)

遍歷矩陣中的每一個直行。

  • 參數

    • 回呼函式 (Function):對每個直行執行的函式,接收 (直行, 直行編號) 兩個參數。

  • 回傳矩陣 - 原矩陣。

清除()

清除矩陣的所有內容,使其成為一個 0x0 的矩陣。

  • 回傳矩陣 - 修改後的原矩陣。

減(目標)

執行矩陣減法。

  • 如果 目標 是數字,則將矩陣的每個元素減去該數值。

  • 如果 目標 是另一個 矩陣 物件,則執行對應元素的相減。

  • 參數

    • 目標 (Number | 矩陣):要相減的純量或矩陣。

  • 回傳矩陣 - 運算後的新矩陣。

const m = new 矩陣([10, 20], [30, 40]);

// 純量相減
const m_minus_5 = m.減(5);
console.log(m_minus_5.轉為字串());
/*
[
  [ 5  15 ]
  [ 25  35 ]
]
*/

// 矩陣相減
const m2 = new 矩陣([1, 2], [3, 4]);
const m_diff = m.減(m2);
console.log(m_diff.轉為字串());
/*
[
  [ 9  18 ]
  [ 27  36 ]
]
*/

直行(直行編號)

取得指定索引的直行。

  • 參數

    • 直行編號 (Number):直行的索引。

  • 回傳Array - 一個代表該直行的陣列。

const m = new 矩陣([1, 2, 3], [4, 5, 6]);
const col2 = m.直行(2);
console.log(col2);
// 輸出: [3, 6]

等於(目標)

檢查目前矩陣是否與另一個矩陣 目標 完全相等。

  • 參數

    • 目標 (矩陣):要比較的矩陣。

  • 回傳Boolean - 如果維度和所有元素都相同,則為 true

const m1 = new 矩陣([1, 2], [3, 4]);
const m2 = new 矩陣([1, 2], [3, 4]);
const m3 = new 矩陣([1, 2], [3, 5]);

console.log(m1.等於(m2)); // true
console.log(m1.等於(m3)); // false

總和(初始值 = 0)

計算矩陣所有元素的總和。

  • 參數

    • 初始值 (Number, optional):加總的起始值,預設為 0

  • 回傳Number - 所有元素的總和。

複製()

建立並回傳一個與目前矩陣完全相同的新矩陣副本。

  • 回傳矩陣 - 新的矩陣副本。

複製範圍(…)

從矩陣中複製一個指定範圍的子矩陣。

  • 參數

    • 起始橫列編號 (Number)

    • 起始直行編號 (Number)

    • 橫列數量 (Number)

    • 直行數量 (Number)

  • 回傳矩陣 - 新的子矩陣。

設定橫列(橫列編號, 值)

用一個向量或陣列來設定指定的橫列。

  • 參數

    • 橫列編號 (Number):要設定的橫列索引。

    • (向量 | Array):新的橫列內容。

  • 回傳矩陣 - 修改後的原矩陣。

設定直行(直行編號, 值)

用一個向量或陣列來設定指定的直行。

  • 參數

    • 直行編號 (Number):要設定的直行索引。

    • (向量 | Array):新的直行內容。

  • 回傳矩陣 - 修改後的原矩陣。

設定維度(新的橫列數量, 新的直行數量)

重新設定矩陣的維度。所有現有元素將被清除,並以預設值(或建構時指定的值)重新填滿。

  • 參數

    • 新的橫列數量 (Number)

    • 新的直行數量 (Number)

  • 回傳矩陣 - 修改後的原矩陣。

轉為字串()

將矩陣轉換為格式化的、易於閱讀的字串。

  • 回傳String

轉置矩陣()

計算並回傳矩陣的轉置矩陣(Transpose Matrix),即交換橫列與直行。

  • 回傳矩陣 - 轉置後的新矩陣。

const m = new 矩陣([1, 2, 3], [4, 5, 6]);
const t_m = m.轉置矩陣();
console.log(t_m.轉為字串());
/*
[
  [ 1  4 ]
  [ 2  5 ]
  [ 3  6 ]
]
*/